# 搜索功能实现
from .tag import Tag, EMPTY_TAG, list_tags
from .bookmark import Bookmark, list_bookmarks

"""
搜索关键字用空格分开，-开头表示去除包含该关键字的结果，其余表示包含该关键字的结果
关键字之间为AND关系
"""
# ========

def _get_tag_from_kws(kws: str) -> Tag:
    for tag in list_tags():
        if tag.name == kws:
            return tag
        for k in tag.kws:
            if k == kws:
                return tag
    return EMPTY_TAG

def _proc_kws(bmks: list[Bookmark], kws: str):
    mode_exclude = kws.startswith("-")
    if mode_exclude:
        kws = kws[1:]
    # 检查kws是不是一个标签
    target_tag = _get_tag_from_kws(kws)
    to_remove_list: list[Bookmark] = list()
    for bmk in bmks:
        if target_tag.uid >= 0:
            # 按照标签处理
            if mode_exclude and (target_tag.uid in bmk.tags):
                # 排除模式，存在标签则去除
                to_remove_list.append(bmk)
            elif (not mode_exclude) and (target_tag.uid not in bmk.tags):
                # 包含模式，不存在标签则去除
                to_remove_list.append(bmk)
        else:
            # 按照关键字处理
            if mode_exclude and (bmk.name.find(kws) >= 0):
                # 排除模式，存在标签则去除
                to_remove_list.append(bmk)
            elif (not mode_exclude) and (bmk.name.find(kws) < 0):
                # 包含模式，不存在标签则去除
                to_remove_list.append(bmk)
    #去除
    for bmk in to_remove_list:
        bmks.remove(bmk)

def search_bookmark(search_text: str) -> list[Bookmark]:
    bmks = list_bookmarks()
    for kws in filter(None, ( kws.strip() for kws in search_text.split() )):
        _proc_kws(bmks, kws)
    return bmks
